package cn.bearspark.comment.provider.dao.mapper;

import cn.bearspark.comment.provider.dao.co.BldgCommentCO;
import cn.bearspark.framework.redis.starter.buffer.hash.un.RedisHashMapper;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Set;

/**
 * 楼评论数据的数据映射接口
 *
 * @author f
 */
@Mapper
public interface BldgCommentMapper extends RedisHashMapper<BldgCommentCO> {

    /**
     * 添加一条楼评论的数据
     *
     * @param commentId   评论 id
     * @param userId      评论的用户 id
     * @param happeningId 评论的动态 id
     */
    @Insert("INSERT INTO t_comment_bldg (comment_id, user_id, happening_id) " +
            "VALUES (#{commentId}, #{userId}, #{happeningId})")
    void insert(long commentId, long userId, long happeningId);

    /**
     * 增加评论的点赞数
     *
     * @param commentId 评论 id
     */
    @Update("UPDATE t_comment_bldg SET like_num = like_num + 1 WHERE comment_id = #{commentId}")
    void incrLikeNum(long commentId);

    /**
     * 减少评论的点赞数
     *
     * @param commentId 评论 id
     */
    @Update("UPDATE t_comment_bldg SET like_num = like_num - 1 WHERE comment_id = #{commentId}")
    void decrLikeNum(long commentId);

    /**
     * 增加评论的回复数
     *
     * @param commentId 评论 id
     */
    @Update("UPDATE t_comment_bldg SET reply_num = reply_num + 1 WHERE comment_id = #{commentId}")
    void incrReplyNum(long commentId);

    /**
     * 减少评论的回复数
     *
     * @param commentId 评论 id
     */
    @Update("UPDATE t_comment_bldg SET reply_num = reply_num - 1 WHERE comment_id = #{commentId}")
    void decrReplyNum(long commentId);

    /**
     * 获取指定楼评论的动态 id
     *
     * @param bldgCommentId 指定的楼评论 id
     * @return 指定楼评论的动态 id
     */
    @Select("SELECT happening_id FROM t_comment_bldg WHERE comment_id = #{bldgCommentId}")
    long getBldgHappeningId(long bldgCommentId);

    /**
     * 获取指定楼评论的动态 id
     *
     * @param bldgCommentId 指定的楼评论 id
     * @param userId        查询该评论的用户 id
     * @return 指定楼评论的动态 id
     */
    @Select("SELECT happening_id FROM t_comment_bldg " +
            "WHERE comment_id = #{bldgCommentId} AND user_id = #{userId}")
    Long getBldgHappeningIdWithUserId(long bldgCommentId, long userId);

    /**
     * 删除指定评论
     *
     * @param commentId 指定评论的 id
     */
    @Delete("DELETE FROM t_comment_bldg WHERE comment_id = #{commentId}")
    void delete(long commentId);

    @Override
    List<BldgCommentCO> listHotData(Set<Long> idSet);

    @Override
    List<BldgCommentCO> listData(List<Long> idList);

    /**
     * 获取楼评论的 id 集合，按照发布时间倒序排序，形成"最新"的效果
     *
     * @param offset      偏移量
     * @param size        获取的元素个数
     * @param happeningId 待查询评论的动态 id
     * @return 楼评论的 id 集合
     */
    List<Long> listBldgIdOrderByPubTime(int offset, int size, long happeningId);

    /**
     * 获取楼评论的 id 集合，按照点赞数倒序排序(如果点赞数一样，则按照时间倒序排序)，形成"最热"的效果
     *
     * @param offset      偏移量
     * @param size        获取的元素个数
     * @param happeningId 待查询评论的动态 id
     * @return 楼评论的 id 集合
     */
    List<Long> listBldgIdOrderByLikeNum(int offset, int size, long happeningId);

    /**
     * 统计指定动态的楼评论数
     *
     * @param happeningId 待查询评论的动态 id
     * @return 指定动态的楼评论数
     */
    @Select("SELECT COUNT(*) FROM t_comment_bldg WHERE happening_id = #{happeningId}")
    long count(long happeningId);
}
